<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>

<title>Cuestionario clase 2</title>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body>
 
<p>
	<strong>
		<font size="5" color="#0000FF" face="Arial, Helvetica, sans-serif">Ejercicios Practicos Clase numero 2 </font>
	</strong>
</p>

<h2> <font color="#006600">0. Consideraciones sobre Internet, el sentido de la vida, el 
universo y todo lo demás. </font></h2>
<p><font color="#FF0000"> <u> Links utilizados para resolver este punto:</u></font></p>
<ul>
	<li> <a href="http://www.youtube.com/watch?v=oHg5SJYRHA0"> Whats really means 42? </a></li>
	<li> <a href="http://www.catb.org/~esr/faqs/hacker-howto.html"> How to become a hacker? </a></li>
	<li> <a href="http://www.netiqueta.org/"> Netiqueta.org </a>	</li>
	<li> <a href="http://samizdat.mines.edu/howto/HowToBeAProgrammer.html"> How to be a Good Programer </a> 	</li>
	<li> <a href="http://www.xkcd.com/323/#"> Alcohol and programing</a>	</li>
</ul>

<blockquote>
    <h4>1. ¿Qué es una RFC?</h4>
    <p>Request For Comments, son una serie de notas sobre Internet, 
publicadas desde 1969.
      Cada una de ellas, individualmente, describe un protocolo de la 
red Internet (originalmente de ARPANET), para que pueda ser implementado
 sin ambigüedades.</p>
    <p> La colección completa de RFCs está formada por más de 3000 
documentos. El encargado de publicarlos es el Editor de RFCs y, aunque 
cualquiera puede proponer un RFC, el IETF (Internet Engineering Task 
Force) es una de las principales fuentes.      </p>
    <p>Existen varias categorías de RFCs, pudiendo ser informativos 
(cuando se trata simplemente de valorar por ejemplo la implantación de 
un protocolo), propuestas de estándares nuevos, o históricos (cuando 
quedan obsoletos por versiones más modernas del protocolo que 
describen).</p>
    <h4>2. ¿Cuál es la RFC sobre netiquette? Resuma esa RFC en los 20 
puntos o menos que considere relacionados con las comunicaciones 
necesarias para este curso.</h4>
    <p>RFC1855 (Request for Comments 1855) es el documento que regula el
 comportamiento de un usuario en un grupo de noticias, una lista de 
correo, un foro de discusiones o al usar el correo electrónico, y por 
extensión al comportamiento general en Internet. </p>
    <ul>
      <li>            Respetar los derechos de copia del material  que 
vamos a reproducir. Casi todos los pais tienen sus propias leyes.</li>
      <li> Sea conservador en lo que envía y liberal en lo que recibe. </li>
      <li> Saber a quién dirigirse para obtener ayuda. Por lo general, 
tienen los recursos al alcance de la mano. </li>
      <li> Recuerdar que el destinatario es un ser humano cuya cultura, 
idioma y humor son diferentes al suyo. Ser cuidadoso con el sarcasmo. </li>
      <li> No use todas mayúsculas, parecerá que esta gritando. </li>
      <li> Si envía mensajes codificados asegúrese de que el 
destinatario puede descifrarlos. </li>
      <li> Sea breve sin ser demasiado conciso. Al responder a un 
mensaje, incluir suficiente material original para ser entendido pero no
 más. Es muy mala forma simplemente responder a un mensaje mediante la 
inclusión de todo el mensaje anterior: edite el material irrelevante. </li>
      <li> El correo debe tener un encabezado con el tema que refleja el
 contenido del mensaje. </li>
      <li> Leer las listas de correo y grupos de noticias uno a dos 
meses antes que publique algo. Esto le ayuda a obtener una comprensión 
de la cultura del grupo. </li>
      <li> No involucrarse ni responder a provocaciones. </li>
      <li> Siendo el Moderador, asegúrese de publicar FAQ en intervalos 
regulares. </li>
      <li> No asumir que cualquier información se encuentra actualizada y
 / o precisa. </li>
      <li> Usar adecuadamente las extensiones para los archivos.</li>
    </ul>
    <h4>3. Lea  Cómo hacer preguntas de manera inteligente y haga un 
resumen.	        </h4>
    <p>-Antes de preguntar:	        </p>
    <ul>
      <li>Intenta encontrar una respuesta leyendo el manual. </li>
      <li>Intenta encontrar una respuesta leyendo las FAQs. </li>
      <li>Intenta encontrar una respuesta buscando en la web. </li>
      <li>Intenta encontrar la respuesta preguntándole a un amigo con 
más experiencia.</li>
    </ul>
    <p>Una vez agotados todos los recursos, piensa y prepara bien la 
pregunta.
	        
	        Nunca asumas que tienes derecho a un pregunta, solo te ganarás 
una respuesta si la pregunta contribuye implícitamente a la experiencia 
de la comunidad antes que solicitar de manera pasiva conocimiento de los
 demás.
	        
	        Es muy buen dejar claro que puedes y quieres participar en el 
proceso de desarrollar la solución y que no quieres la respuesta " 
servida" .</p>
    <p> -Cuando preguntes:
      Elegir el foro con cuidado, rechazarán tu consulta si: </p>
    <ul>
      <li>publicas tu pregunta en un foro en el que se encuentra fuera 
de lugar (off topic)            </li>
      <li>publicas una pregunta muy elemental en un foro en el que se 
esperan preguntas técnicas avanzadas, o viceversa.</li>
      <li>publicas el mensaje al mismo tiempo en grupos de noticas muy 
diferentes (cross-posting).</li>
    </ul>
    <p> Escribe de manera clara respetando la ortografía y la gramática.</p>
    <p>Envía las preguntas en formatos que sean fáciles de entender,  
como ser correo en texto plano: no en HTML, MIME Quoted-Printable y 
mucho menos documentos propietarios como Microsoft Word.</p>
    <p> Usa títulos específicos y con sentido.</p>
    <p> Sé preciso e informativo sobre tu problema: </p>
    <ul>
      <li>Describe los síntomas de tu problema o error con cuidado y 
claramente. </li>
      <li>Describe el entorno en el que ocurre (máquina, S.O., 
aplicación). </li>
      <li>Describe la investigación que llevaste a cabo para acotar una 
posible respuesta al problema antes de hacer la pregunta. </li>
      <li>Describe los pasos de diagnóstico que llevaste a cabo e 
intenta solucionar el problema tú mismo antes de formular la cuestión. </li>
      <li>Describe cualquier cambio reciente en tu ordenador o 
combinación de software que pueda resultar relevante. </li>
    </ul>
    <p>Describe los síntomas del problema, no tus suposiciones. </p>
    <p>Describe los síntomas de tu problema en orden cronológico, 
generalmente las pistas más útiles para averiguar qué ha ido mal se 
encuentran a menudo en los acontecimientos inmediatamente anteriores. </p>
    <p>No solicites que te respondan por correo en privado. Los hackers 
creen que resolver problemas debería ser un proceso público y 
transparente durante el cual un primer intento de respuesta puede y 
debería corregirse si alguien con más conocimientos percibe que la 
respuesta es incompleta o incorrecta.
	        Hay una excepción limitada a esta regla: Si piensas que puedes 
recibir una gran cantidad de respuestas muy similares y consideras 
oportuno hacer un resúmen para el grupo. </p>
    <p>Evita las preguntas insustanciales.</p>
    <p> La cortesía nunca hiere, e incluso a veces hasta ayuda. </p>
    <p>Concluye con una breve nota sobre la solución</p>
    <p> -Cómo interpretar las respuestas: </p>
    <p>RTFM y STFW: formas de hacer saber que has " metido la pata"     
    </p>
    <p>Si no entiendes la respuesta, no devuelvas inmediatamente la 
solicitud de una clarificación. Usa las mismas herramientas que 
utilizaste para intentar resolver tu pregunta original para entender la 
respuesta.    </p>
    <h4> 4. ¿Qué es un hacker?	        </h4>
  <p>Son personas aficionadas a los desafios técnico y a resolver 
problemas complejos utilizando su creatividad.</p>
	<p> La mentalidad hacker no está solo relacionada a la cultura del 
software. Hay gente que aplica la actitud de hacker a otras cosas, como 
la electrónica o la música, o cualquier otra ciencia o arte. </p>
    <p>Existe otro grupo de personas que se llaman a sí mismos hackers, 
pero que no lo son. Son personas que se divierten irrumpiendo 
ilegalmente en ordenadores y haciendo " phreaking"  en el sistema 
teléfonico, llamados crackers. </p>
    <p>Los hackers resuelven problemas y construyen cosas, y creen en la
 libertad y la ayuda voluntaria mutua.	        </p>
    <p>El término " hacker"  se remonta décadas atrás a los tiempos de 
los primeros miniordenadores de tiempo compartido y los tempranos 
experimentos con ARPAnet, proveniente de una comunidad, una cultura 
compartida, de programadores expertos y magos de las redes. </p>
    <h4>5. Cómo convertirse en hacker.</h4>
    <p> La actitud del hacker</p>
    <p> Los hackers resuelven problemas y construyen cosas, y creen en 
la libertad y la ayuda voluntaria mutua. Para ser aceptado, deberás 
comportarte como si tuvieras esta actitud en tu interior. Y para 
comportarte como si tuvieras esta actitud, deberás creerte de verdad 
dicha actitud. </p>
    <ul>
      <li>Ser hacker es divertido, pero es esa clase de diversión que 
requiere mucho esfuerzo y motivación. </li>
      <li>El tiempo es un bien precioso, por eso, es casi una obligación
 moral el compartir la información, resolver los problemas y luego 
exponer la solución de manera que los otros hackers puedan resolver 
nuevos problemas, en lugar de enfrentarse perpetuamente con los viejos. </li>
      <li>Las tareas rutinarias, repetitivas y aburridas no sólo son 
desagradables, sino intrínsecamente perversas. </li>
      <li>La actitud autoritaria debe ser combatida donde sea que se la 
encuentre, pues si se la deja te asfixiará, tanto a ti como a otros 
hackers. </li>
      <li>Tener solo la actitud no te transformará en hacker, para 
transformarte en hacker necesitarás inteligencia, práctica, dedicación y
 trabajo duro. Por lo tanto, debes aprender a desconfiar de la actitud y
 respetar la competencia en todas sus formas.</li>
    </ul>
    <p>Habilidades básicas para el hacking </p>
    <ul>
      <li>Aprender a programar es, sin lugar a dudas, la habilidad 
fundamental del hacker. Hay que aprender a pensar en los problemas de 
programación de una manera general, independiente de cualquier lenguaje.
 </li>
      <li>Consigue uno de los Unices libres; aprende a usarlo y a 
ponerlo en funcionamiento. </li>
      <li>Aprende a usar la Web y a programar en HTML. </li>
      <li>Aprender Inglés funcional, si no lo tienes. </li>
    </ul>
    <p>Estatus en la cultura hacker</p>
    <p> Se adquiere estatus y reputación por donar cosas. 
Específicamente, al donar tiempo, creatividad, y el resultado de la 
destreza.
      Existen básicamente cinco clases de cosas que puedes hacer para 
obtener el respeto de los hackers: </p>
    <ul>
      <li>Escribir software de fuente abierta: que los otros hackers 
opinen que son divertidos o útiles, y donar los fuentes del programa a 
la cultura hacker para que sean utilizados. </li>
      <li>Ayudar a probar y depurar software de fuente abierta </li>
      <li>Publicar información útil </li>
      <li>Ayudar a mantener en funcionamiento la infraestructura: 
administrar listas de correo, moderar foros de discusión, mantener 
sitios donde se archivan grandes cantidades de software, desarrollar 
RFCs y otros estándares técnicos. </li>
      <li>Hacer algo por la cultura hacker en sí misma</li>
    </ul>
</blockquote>
  <h2><font color="#006600">1. Servidor Web    </font></h2>
  <p><font color="#FF0000"> <u> Links utilizados para resolver estos puntos:</u></font></p>
<ul>
	<li> <a href="http://httpd.apache.org/docs/2.2/"> Apache Oficial documentation</a>	</li>
	<li> <a href="http://www.cibernetia.com/manuales/instalacion_servidor_web/index.php"> Introduccion a servidores webs </a>	</li>
	<li> <a href="http://www.cibernetia.com/manuales/instalacion_servidor_web/2_3_configuracion_apache.php"> Configuracion de Apache server</a> 	</li>
	<li> <a href="http://languagelog.ldc.upenn.edu/myl/llog/duty_calls.png"> Somebody is wrong on the internet!</a>	</li>
</ul>

  
  <p>1.1.Apache</p>
  <blockquote>
      <h4> 1.¿Qué es un servidor Web?        </h4>
      <p>El servidor Web es un programa que corre sobre un servidor 
manteniéndose a la espera de peticiones HTTP (hypertext transfer 
protocol), protocolo que pertenece a la capa de aplicación del modelo 
OSI.</p>
      <p> Está diseñado para transferir hipertextos, páginas web o 
páginas HTML.
        Dependiendo del tipo de la petición, el servidor Web buscará una
 página Web o bien ejecutará un programa en el servidor. De cualquier 
modo, siempre devolverá algún tipo de resultado HTML al cliente o 
navegador que realizó la petición.</p>
      <h4> 2. ¿Qué es una RFC?        </h4>
      <p>Resuelto en el punto 0.1.</p>
      <h4> 3. ¿Cuáles son las RFC de HTTP y HTML?        </h4>
      <p>RFC 2616 es el documento del protocolo HTTP.        </p>
      <p>Mientras que el del protocolo HTML es el RFC 1866.</p>
      <h4> 4. ¿Qué es la fundación Apache?</h4>
      <p> Apache Software Foundation es una comunidad descentralizada de
 desarrolladores que trabajan cada uno en sus propios proyectos de 
código abierto. Los proyectos Apache se caracterizan por un modelo de 
desarrollo basado en el consenso, la colaboración y en una licencia de 
software abierta y pragmática. Cada proyecto es gestionada por un grupo 
autoseleccionado de expertos técnicos que son participantes activos en 
dicho proyecto.</p>
      <p> La pertenencia a la fundación se permite sólo a voluntarios 
que hayan contribuido significativamente a proyectos Apache.</p>
      <p> Es más que un grupo de proyectos compartiendo un servidor, es 
una comunidad de desarrolladores y usuarios.</p>
      <p> Entre los objetivos de la fundación se encuentran el de 
proporcionar protección legal a los voluntarios que trabajan en 
proyectos Apache, y al propio nombre Apache de ser empleado por otras 
organizaciones.</p>
      <h4> 5. Nombre 4 proyectos que patrocina la fundación Apache      
  </h4>
      <ul>
        <li><a href="http://excalibur.apache.org/"> Excalibur </a></li>
        <li><a href="http://db.apache.org/">DB project</a></li>
        <li><a href="http://xerces.apache.org/"> Xerces</a></li>
        <li><a href="http://spamassassin.apache.org/">SpamAssassin</a></li>
      </ul>
      <h4> 6. ¿Cuáles son los archivos de configuración de Apache 2.2 en
 GNU/Debian y qué contiene cada uno de ellos?</h4>
      <p> Los ficheros de configuración principales son tres, 
httpd.conf, srm.conf y acces.conf, que por defecto están en el 
directorio /etc/httpd/conf del RootDir del servidor.          </p>
      <p>El fichero http.conf configura atributos generales del servidor
 (parámetros globales, directivas de funcionamiento, hosts virtuales): 
el número de puerto o el usuario que lo ejecuta, por ejemplo.          </p>
      <p>El archivo srm.conf configura la raíz del árbol de los 
documentos, funciones especiales como HTML analizado sintácticamente por
 el servidor, mapa de imagen, etc.          </p>
      <p>Por último, access.conf configura los accesos.</p>
      <p> Además de estos tres ficheros, el comportamiento del servidor 
puede ser modificado directorio a directorio usando los ficheros 
.htaccess para daale al servidor de web una configuración base y un 
directorio personalizado para directorios.</p>
      <p> También existe un fichero adicional en el directorio 
/etc/httpd/conf llamado mime.conf, pero este fichero normalmente no 
tiene que ser editado.          </p>
      <h4>7. ¿Cómo se configuran tres hosts virtuales (llamémoslos uno, 
dos y tres si solamente tenemos el IP 111.222.333.444 para nuestro web 
server? Indique cuáles son los archivos que hay que modificar, cómo 
activar / desactivar los hosts virtuales, cómo reiniciar o recargar la 
configuración de Apache.          </h4>
      <p>Los archivos que hay que modificar son dos, host del Sistema 
Operativo y el fichero httpd.conf. A continuación se detalla el proceso 
de configuración de los tres host virtuales:          </p>
      <p>Primer paso: Módulo Proxy</p>
      <p> Se debe verificar que Apache sea capaz de utilizar " Virtual 
Hosting" . Para esto se requiere que el módulo proxy este habilitado (si
 ejecuta el comando httpd -l debe aparecer una linea con mod_proxy.c), 
de no ser así , entonces debe instalar este módulo.          </p>
      <p>Segundo paso: Configuración del archivo host del Sistema 
Operativo.</p>
      <p> Este archivo asigna direcciones IP a los nombres de host. En 
Linux lo podemos encontrar en el directorio /etc/hosts mientras que para
 Windows lo encontramos en C:/Windows/System32/Drivers/etc/.</p>
      <p> Este fichero se debe modificar e incluir los distintos sitios,
 agregando las siguientes lineas:          </p>
      <blockquote>
        <p>111.222.333.444		www.sitio-uno.com.ar          </p>
        <p>111.222.333.444		www.sitio-dos.com.ar          </p>
        <p>111.222.333.444		www.sitio-tres.com.ar          </p>
      </blockquote>
      <p>Lo anterior permite al " Resolver"  (encargado de encontrar la 
resolución de nombres para todos los programas que soliciten una 
resolución) del Host identificar que cualquier solicitud para 
www.sitio-uno.com.ar, www.sitio-dos.com.ar o www.sitio-tres.com.ar sea 
enviada a la máquina local (111.222.333.444).</p>
      <p> Tercer Paso:Configuración del fichero httpd.conf de Apache.</p>
      <p> Ahora, se deberá configurar el servidor Apache para que acepte
 los nombres de dominio agregados al archivo host y los relacione con 
las carpetas que albergan los archivos de los diferentes sitios.        
  </p>
      <p>Para esto, se debe dirigir a la sección " Virtual Host"  dentro
 del archivo httpd.conf, que permite definir los parámetros de cada uno 
de los servidores.</p>
      <p> En el actual caso, la configuración sería la siguiente:       
   </p>
      <p>Eliminar o comentar el parámetro ServerName y substituirlo por 
NameVirtualHost.</p>
      <blockquote>
        <p> #ServerName www.sitioX.com</p>
        <p> Port 80				#indica el puerto TCP sobre el cual responderá 
Apache </p>
        <p>NameVirtualHost 111.222.333.444		#permiso para trabajar con 
host virtuales basados en nombres.</p>
        <p> #Sitio Uno </p>
        <p> &lt;VirtualHost 111.222.333.444:80&gt;</p>
        <p> DocumentRoot " C:/wwww/uno" </p>
        <p> ServerName www.sitio-uno.com.ar</p>
        <p>&lt;/Virtualhost&gt; </p>
        <p> 
          #Sitio Dos      </p>
        <p> &lt;VirtualHost 111.222.333.444:80&gt;	  </p>
        <p>DocumentRoot " C:/wwww/dos" 	  </p>
        <p>ServerName www.sitio-dos.com.ar</p>
        <p>&lt; /Virtualhost&gt;</p>
        <p> #Sitio Tres</p>
        <p> &lt; VirtualHost 111.222.333.444:80&gt;		</p>
        <p>DocumentRoot " C:/wwww/tres" 		</p>
        <p>ServerName www.sitio-tres.com.ar</p>
        <p>&lt; /Virtualhost&gt; </p>
      </blockquote>
      <p>DocumentRoot: es la ruta en la cual se guarda el sitio web.</p>
      <p> ServerName: es el nombre del host que previamente agregamos al
 archivo host del Sistema Operativo.	</p>
      <p>Adicionalmente, se pueden agregar otros valores a los 
parámetros tal como si cada host virtual fuera un host independiente. 
Como ser: DirectoryIndex, ErrorLog, ScriptAlias, DocumentRoot, entre 
otros.</p>
      <p> Los parámetros no definidos dentro de cada " Virtual Host"  
asumirán el valor global definido en httpd.conf.</p>
      <p> El comando de Apache para recargar/reiniciar la configuración 
es:
        apachectl restart,
      y todos los parámetros que se incluyan en httpd.conf serán 
validados previo arranque del Servidor Web.</p>
      <h4> 8. Indique cómo se configura Apache para que los logs de cada
 sitio virtual vayan a archivos separados del sitio principal y 
separados entre sí.	</h4>
      <p>Se debe agregar dentro de la definición de cada host virtual, 
los parámetros CustomLog y ErrorLog, que registran los accesos y errores
 del sitio administrado. Estos registros son los que ofrecen 
estadísticas sobre el número de visitantes, el origen de cada usuario, 
los posibles errores, etc.        </p>
      <h4>9. Indique cómo configura el nombre del servidor, la dirección
 del responsable (webmaster) y el directorio raíz donde alojará las 
páginas del sitio virtual.        </h4>
      <p>Los parámetros para configurar el nombre del servidor, la 
direccion de mail del responsable y el directorio raiz son: ServerName, 
ServerAdmin y DocumentRoot respectivamente.</p>
      <p> La configuración del fichero httpd.conf, teniendo en cuenta 
los parámetros propuestos por los puntos 8 y 9, quedaría:        </p>
      <blockquote>
        <p>#ServerName www.sitioX.com        </p>
        <p>Port 80
          NameVirtualHost 111.222.333.444</p>
        <p> #Sitio Uno </p>
        <p> &lt;VirtualHost 111.222.333.444:80&gt;	  </p>
        <p>DocumentRoot " C:/wwww/uno" 	  </p>
        <p>ServerName www.sitio-uno.com.ar</p>
        <p> CustomLog " C:/wwww/uno/log" </p>
        <p> ErrorLog " C:/wwww/uno/log-error" 	  </p>
        <p>ServerAdmin webmaster@uno.com.ar</p>
        <p> &lt;/VirtualHost&gt;	  </p>
        <p>#Sitio Dos	  </p>
        <p> &lt;VirtualHost 111.222.333.444:80&gt;</p>
        <p> DocumentRoot " C:/wwww/dos" </p>
        <p> ServerName www.sitio-dos.com.ar	  </p>
        <p>CustomLog " C:/wwww/dos/log" </p>
        <p> ErrorLog " C:/wwww/dos/log-error" </p>
        <p> ServerAdmin webmaster@dos.com.ar</p>
        <p> &lt;/VirtualHost&gt;	  </p>
        <p>#Sitio Tres	  </p>
        <p> &lt; VirtualHost 111.222.333.444:80&gt;	  </p>
        <p>DocumentRoot " C:/wwww/tres" 	  </p>
        <p>ServerName www.sitio-tres.com.ar</p>
        <p> CustomLog " C:/wwww/dos/log" 	  </p>
        <p>ErrorLog " C:/wwww/dos/log-error" 	  </p>
        <p>ServerAdmin webmaster@tres.com.ar		</p>
        <p> &lt;/VirtualHost&gt;       </p>
      </blockquote>
      <h4>10. ¿Cuáles son los permisos que deben tener los archivos en 
el raíz de los documentos? Indique los más restrictivos que funcionan y 
puede editarlos usando la cuenta que le fue entregada. ¿Quién debe ser 
el dueño y el grupo de esos archivos y directorios?</h4>
</blockquote>
    <h2><font color="#006600"> 2. Interfaz de usuario</font></h2>
  <p><font color="#FF0000"> <u> Links utilizados para resolver estos ejercicios:</u></font></p>
	<ul>
		<li> <a href="http://www.debian.org/doc/"> Debian Wiki </a>	</li>
		<li> <a href="http://tldp.org/HOWTO/Unix-and-Internet-Fundamentals-HOWTO/"> Fundamentos de internet y linux </a> </li>
		<li> <a href="http://ingenio.chez.com/comandos.html"> Tabla con comandos generales de Linux </a>	</li>
		<li> <a href="http://www.aboutdebian.com/"> Tutorial Linux\Debian </a> 	</li>
		<li> <a href="http://xkcd.com/456/"> Parental Control</a>	</li>
	</ul>


    <h4> 2.1. Bash</h4>
    <blockquote>
      <h4> 1. man es el manual online de los sistemas Unix. Busca las 
páginas de manual relacionadas con ls, mkdir, rmdir, rm, mv, cp, echo, 
bash, grep, wc, cd, pwd, id, less.</h4>
      <p> Comando ls: lista información sobre archivos (el directorio 
actual por defecto).</p>
      <p> http://linuxmanpages.com/man1/ls.1.php        </p>
      <p>Comando mkdir: crea un nuevo directorio.        </p>
      <p>http://linuxmanpages.com/man1/mkdir.1.php</p>
      <p> Comando rmdir: elimina un directorio (siempre y cuando esté 
vacío).        </p>
      <p>http://linuxmanpages.com/man1/rmdir.1.php</p>
      <p> Comando rm: elimina archivos.        </p>
      <p>http://linuxmanpages.com/man1/rm.1.php        </p>
      <p>Comando mv: modifica el nombre de los archivos y directorios 
moviéndolos de una ubicación a otra.</p>
      <p> http://linuxmanpages.com/man1/mv.1.php        </p>
      <p>Comando cp:permite copiar archivos y directorios.        </p>
      <p>http://linuxmanpages.com/man1/cp.1.php        </p>
      <p>Comando echo: muestra una linea de texto.        </p>
      <p>http://linuxmanpages.com/man1/echo.1.php</p>
      <p> Bash: intérprete de comandos.</p>
      <p> http://linuxmanpages.com/man1/bash.1.php</p>
      <p> Comando grep: busca en uno o más archivos las líneas que 
coincidan con un patron dado.</p>
      <p> http://linuxmanpages.com/man1/grep.1.php</p>
      <p> Comando wc: imprime el número de líneas, palabras y bytes en 
los archivos.        </p>
      <p>http://linuxmanpages.com/man1/wc.1.php</p>
      <p> Comando cd: cambia de directorio.</p>
      <p> http://linuxmanpages.com/man1/cd.1.php        </p>
      <p>Comando pwd: muestra la ruta del directorio actual de trabajo. 
      </p>
      <p>http://linuxmanpages.com/man1/pwd.1.php        </p>
      <p>Comando id: muestra el id del usuario y del grupo.        </p>
      <p>http://linuxmanpages.com/man1/id.1.php</p>
      <p> Comando less:</p>
      <p> http://linuxmanpages.com/man1/less.1.php</p>
      <h4> 2. cuál es la diferencia entre un shell de login y uno que no
 es de login (pista: environment)        </h4>
      <h4>3. cuál es una secuencia de mandatos que crea un árbol de 
directorios con la siguiente forma: </h4>
      <p>basicos/</p>
       <p> php-basicos/ </p>
      <blockquote>        
        <p>ej01/          </p>
        <p>ej02/ </p>
      </blockquote>
      <p>html/          </p>
      <p>imagenes/ </p>
      <p>La secuencia de comandos es:          </p>
      <blockquote>
        <p>mkdir basicos
          mkdir -p </p>
        <p>php-basicos/ej01
          mkdir -p </p>
        <p>php-basicos/ej02          </p>
        <p>mkdir html
          mkdir imagenes          </p>
        <p>ls -R				//lista los subdirectorios recursivamente.</p>
      </blockquote>
      <h4> 4. permisos de un archivo y de un directorio: explique qué es
 el dueño, el grupo y los otros.          </h4>
      <p>Los permisos que un determinado usuario puede tener sobre un 
archivo o directorio se establecen en tres niveles:          </p>
      <ul>
        <li>Permisos del Propietario          </li>
        <li>Permisos del Grupo          </li>
        <li>Permisos del resto de los usuarios          </li>
      </ul>
      <p>El propietario es aquel usuario que genera o crea un archivo 
dentro de su directorio de trabajo en un directorio sobre el que tenga 
derechos. Cada usuario tiene la potestad de crear, por defecto, los 
archivos que quiera dentro de su directorio de trabajo. En principio, él
 y solamente él será el que tenga acceso a la información contenida en 
los archivos y directorios que hay en su directorio HOME.          </p>
      <p>Además, lo normal es que cada usuario pertenezca a un grupo de 
trabajo. De esta forma, cuando se gestiona el grupo, se gestionan todos 
los usuarios que pertenecen a éste. Es decir, es más fácil integrar 
varios usuarios en un grupo al que se le conceden determinados 
privilegios en el sistema, que asignar los privilegios de forma 
independiente a cada usuario.          </p>
      <p>Por último, también los privilegios de archivos contenidos en 
cualquier directorio de la estructura, pueden tenerlos otros usuarios 
que no pertenezcan al grupo de trabajo en el que está integrado el 
archivo en cuestión. Es decir, a los usuarios que no pertenecen al grupo
 de trabajo en el que está el archivo, pero que pertenecen a otros 
grupos de trabajo, se les denomina resto de usuarios del sistema.       
   </p>
      <p>También, existirá un superusuario que tendrá privilegios sobre 
todos los archivos directorios, dispositivos, etc., que existan en el 
sistema. Éste será el que dé o quite los privilegios.          </p>
      <p>Tipos de permisos          </p>
      <p>Cada archivo en Unix/Linux queda identificado por 10 caracteres
 (también denominado máscara). De estos 10 caracteres, el primero de la 
izquierda hace referencia al tipo de archivo. El resto, es decir, los 9 
siguientes, de izquierda a derecha y en bloques de 3, hacen referencia a
 los permisos que se le conceden, respectivamente, al propietario, al 
grupo y al resto.          </p>
      <p>El primer carácter de los archivos puede ser: " -"  (archivo), "
 d"  (directorio), " b"  (archivo de bloques especiales), " c"  (archivo
 de caracteres especiales), " l"  (archivo de vinculo o enlace) o " p"  
(archivo especial de cauce).          </p>
      <p>Los siguientes nueve caraceteres pueden ser: " -"  (sin 
permiso), " r"  (perimiso de lectura), " w"  (permiso de escritura) o " 
x"  (permiso de ejecución).          </p>
      <p>Permisos para archivos          </p>
      <ul>
        <li>Lectura: permite ver el contenido del archivo.</li>
        <li> Escritura: permite editar el contenido del archivo.        
  </li>
        <li>Ejecución: permite ejecutar el archivo (si se trata de un 
programa ejecutable).          </li>
      </ul>
      <p>Permisos para directorios</p>
      <ul>
        <li> Lectura: Permite saber qué archivos y directorios contiene 
el directorio que tiene este permiso.          </li>
        <li>Escritura: permite crear (y eliminar) archivos en el 
directorio (archivos ordinarios o nuevos directorios).          </li>
        <li>Ejecución: permite situarse sobre el directorio para poder 
examinar su contenido, copiar archivos de él.          </li>
      </ul>
      <p>Los derechos, privilegios o autorizaciones que el sistema 
genera por defecto varían según las versiones de Unix/Linux que se 
utilice. En general, son los siguientes:</p>
      <p> Para archivos: -rw- r-- r--          </p>
      <p>Para directorios: -rwx rwx rwx</p>
      <p> El comando chmod permite modificar los diferentes permisos a 
los archivos (http://linuxmanpages.com/man1/chmod.1.php).          </p>
      <h4>5. Si tu nombre de usuario es jperez, tu grupo es seia; por 
otro lado el web server corre con dueño www-data y grupo www-data:</h4>
      <ul>
        <li>¿quién tiene que ser el dueño un script en tu web server? El
 proceso del web server tiene que poder ejecutarlo. </li>
      </ul>
      <blockquote>
        <p>El dueño tiene que ser jperez          </p>
      </blockquote>
      <ul>
        <li> ¿cuál tiene que ser el grupo?</li>
      </ul>
      <blockquote>
        <p> El grupo tiene que se seia          </p>
      </blockquote>
      <ul>
        <li>¿cuáles los permisos del archivo? Debes utilizar los 
permisos lo más restringidos posibles que permitan al web server 
ejecutarlo. Por ejemplo, los otros usuarios del sistema no deben poder 
modificar tu archivo.          </li>
      </ul>
      <blockquote>
        <p>Permisos: -rw-r--r--          </p>
        <p>Solo podrá ser ejecutado por los mienbros del grupo y por el 
web server (Otros).</p>
      </blockquote>
      <h4> 6. aprende a usar un editor de programas. Puedes usar: nano, 
vim, emacs. Practica las operaciones básicas: abrir un archivo 
existente; crear un archivo nuevo; salir grabando los cambios; salir sin
 grabar los cambios; moverte de a un carácter hacia adelante y atrás; 
mover de a línea hacia arriba y abajo; ir al principio del renglón; ir 
al final del renglón; moverse entre palabras hacia adelante y hacia 
atrás; etc.          </h4>
      <h4>7. si escribes una página con HTML estático, o un archivo de 
imagen, ¿Cuáles serán el dueño, grupo y permisos del mismo, de tal 
manera de poder servirlos con el servidor web?          </h4>
      <blockquote>
        <p>Dueño: (1016) mandrille          </p>
        <p>Grupo: (1002) alumno</p>
        <p> Permisos: -rw-r--r--          </p>
      </blockquote>
      <h4>8. edita un script que tenga la secuencia de mandatos anterior
 y ejecútalo.          </h4>
      <h4>9. indique cuáles son los mandatos que sirven para: </h4>
      <ul>
        <li> ver cuales archivos hay en un directorio dado: ls 
directorio            </li>
        <li>ver cuáles son archivos y cuáles son directorios: file 
archivo, devuelve el tipo de archivo. </li>
        <li>ver el tamaño de un archivo: du archivo, devuelve el tamaño 
en KB </li>
        <li> ver cuántos renglones tiene un archivo: " wc archivo"      
       </li>
        <li>ver la fecha actual del sistema: " date"             </li>
      </ul>
      <h4>10. ¿cómo se hacen las redirecciones de entrada y salida de un
 script? Escribe una línea de shell que averigue la fecha en formato 
AAAA-MM-DD y que la grabe en un archivo hoy.txt. Escribe una línea de 
shell que lea el log del web server. </h4>
      <p>comando &gt; archivo_destino			#Pasa el resultado del comando 
al achivo destino.</p>
      <p> comando &lt; archivo_origen			#comando lee una serie de datos 
del archivo origen. </p>
      <p>comando &lt; archivo_origen &gt; archivo_destino	#comando lee 
una serie de datos del archivo origen pero que ademas muestra unos 
resultados.</p>
      <p> Para el caso planteado:</p>
      <p> date +%F&gt;hoy.txt				#envia la fecha en el formato 
solicitado a hoy.txt </p>
      <p>cat &lt; hoy.txt (o también, cat hoy.txt)		#lee el log del web 
server.</p>
      <h4> 11. Tuberías. Escribe una línea de shell que lea un archivo 
de texto, obtenga las líneas que digan «ESTO» y las cuente.          </h4>
      <p>Una tuberia (pipe) conecta la salida estándar de un comando con
 la entrada estándar de otro comando automaticamente.</p>
      <p> comando1 | comando2          </p>
      <p>Para el caso planteado:          </p>
      <p>grep [esto] hoy.txt | wc -l          </p>
      <h4>12. Explica para qué se usa " tail -f" . Da un ejemplo con los
 archivos de log del web server.</h4>
      <p> El comando muestra las últimas filas de un fichero, por 
defecto muestra las ultimas 10 líneas.
        " tail -f"  muestra las últimas filas de un archivo y va 
mostrando las filas que se van agregando.          </p>
      <h4>13. EL mandato ps sirve para ver los procesos en el sistema.  
      </h4>
      <ul>
        <li>
          <h4>busca los procesos correspondientes a tu sesión (sesión: 
¿qué es eso?) </h4>
		<p> Comando: ps -T. Devuelve todos los procesos de nuestra terminal </p>
        </li>
			
        <li>
          <h4> busca los procesos del web server y del postgresql </h4>
		<p> Comando: ps -u postgres. </p>
		<p> Comando: ps xua.</p>
		
        </li>
        <li>
          <h4> explica que es el pid y el ppid </h4>

<p>
PID es un identificador unico de proceso y PPID es el identificador del 
padre del proceso
</p>
		
        </li>
        <li>
          <h4>¿qué es el RSS? </h4>

	<p>RSS es una familia de formatos de fuentes web codificados en XML. Se
 utiliza para suministrar a suscriptores de informacion actualizada 
frecuentemente. El formato 
	permite distribuir contenido sin necesidad de un navegador, utilizando 
un software disenado para leer estos contenidos RSS (agregador). A pesar
 de eso, es posible 
	utilizar el mismo navegador para ver los contenidos RSS. <br> 
	Las ultimas versiones de los principales navegadores permiten leer los 
RSS sin necesidad de software adicional. RSS es parte de la familia de 
los formatos XML 
	desarrollado especificamente para todo tipo de sitios que se actualicen
 con frecuencia y por medio del cual se puede compartir la informacion y
 usarla en otros sitios 
	web o programas. A esto se le conoce como redifusion web o sindicacion 
web (una traduccion incorrecta, pero de uso muy comun).</p>

        </li>
        <li>
          <h4> busca los procesos de un usuario dado, por ejemplo el 
www-data </h4>
		<p> Comando: ps -u www-data. Devuelve todos los procesos del usuario 
www-data </p>
        </li>
      </ul>
    </blockquote>
    <h2><font color="#006600">3. Interfaz de gestión de la base de datos.</font></h2>
	
	<p><font color="#FF0000"> <u> Links utilizados para resolver estos ejercicios:</u></font></p>
	<ul>
		<li> <a href="http://www.postgresql.org/docs/"> Official Postgresql Documentation</a>	</li>
		<li> <a href="http://technet.microsoft.com/es-es/library/bb510741.aspx"> Referencias de Microsoft TransacSQL </a>	</li>
		<li> <a href="http://xkcd.com/244/"> No recursivity! </a> 	</li>
	</ul>	

    <h4> 3.1. PostgreSQL psql    </h4>
    <blockquote>
      <h4>1. crear base        </h4>

<blockquote>
	Las bases de datos se crean dentro de Postgres con el comando "create 
base-de-datos". <br>
	createdb es un utilitario hecho para suministrar la misma funcion fuera
 de Postgres, a partir de la linea de comandos.<br>
	El motor de Postgres debe estar corriendo para que cualquiera de los 
dos modos funcione, y el usuario que da el comando debe ser el 
supe-usuario de Postgres, o haber 
	obtenido privilegio por parte del super-usuario para crear bases de 
datos. <br>

	Para crear una base de datos llamada "mibd" a partir de la linea de 
comandos, escriba: <br> 
<pre>	% createdb mibd
</pre>
	y para obtener el mismo resultado dentro de psql escriba :
<pre>	* CREATE DATABASE mibd;
</pre>	
	Si no tiene el privilegio necesario para crear una base de datos, vera 
el siguiente mensaje: <br>
	% createdb mibd
<pre>	WARN:user "your username" is not allowed to create/destroy databases
	createdb: database creation failed on mibd.

</pre>
	Postgres le permite crear cualquier numero de bases de datos en un 
servidor y usted sera automaticamente el administrador de la base de 
datos que acaba de crear. 
	Los nombres de las bases de datos deben comenzar por una letra y estan 
limitados a una longitud total de 32 caracteres. <br>
</blockquote>


      <h4>2. crear tabla        </h4>

<blockquote>	
	Nombre <br>
	<b>CREATE TABLE</b> :Crea una nueva tabla <br>
	<br>
	<pre>		CREATE [ TEMPORARY | TEMP ] TABLE table (
		    column type
		    [ NULL | NOT NULL ] [ UNIQUE ] [ DEFAULT value ]
		    [column_constraint_clause | PRIMARY KEY } [ ... ] ]
		    [, ... ]
		    [, PRIMARY KEY ( column [, ...] ) ]
		    [, CHECK ( condition ) ]
		    [, table_constraint_clause ]
		    ) [ INHERITS ( inherited_table [, ...] ) ]
	</pre>
	
	<b>Entradas: </b> <br>

	<br>
	-TEMPORARY: Se crea la tabla para esta sesion y es eliminada 
automaticamente con el fin de la sesion. Las tablas permanentes 
existentes con el mismo nombre no son visibles mientras 
	la table temporal existe. <br>
	table: El nombre de una nueva clase o tabla a crear. <br>
	column: El nombre de un campo. <br>
	type: El tipo del campo. Puede incluir especificadores de array. <br>
	<br>
	-DEFAULT value: Un valor por defecto para el campo.<br>

	column_constraint_clause: La clausula opcional de restricciones 
(constraint) especifica una lista de restricciones de integridad o 
comprueba que las nuevas inserciones 
	o actualizaciones deben satisfacer para que la insercion no la 
actualizacion tenga esto. Cada restriccion debe evaluarse a una 
expresion booleana.<br>
	table_constraint_clause: La clausula opcional CONSTRAINT especifica una
 lista de restricciones de integridad que las nuevas inserciones o las 
actualizaciones debera 
	satisfacer para que una sentencia insert o update tenga.  <br>
	<br>
	-INHERITS inherited_table: La clausula opcional INHERITS especifica una
 coleccion de nombres de tabla de las cuales esta tabla hereda todos los
 campos. Si algun campo 
	heredado aparece mas de una vez, Postgres informa de un error. Postgres
 permite automaticamente a la tabla creada heredar funciones de las 
tablas superiores a ella en 
	la jerarquia de herencia. <br>
</blockquote>

      <h4>3. insert / update / delete        </h4>

<blockquote>
	<b>*INSERT</b> :Inserta filas nuevas en una tabla <br>
	<pre>		INSERT INTO table [ ( column [, ...] ) ]
		    { VALUES ( expression [, ...] ) | SELECT query }
	</pre>   
	<b> Entradas: </b> <br>
	table: El nombre de una tabla existente. <br>

	column: El nombre de una columna en table.  <br>
	expression: Una expresion un valor valido a asignar en column.  <br>
	query: Una consulta valida.  <br>
	<br>
	<b>*UPDATE</b> :Substituye valores de columnas en una tabla. <br>
	<pre>		UPDATE tabla SET columna = expresion
		&gt; [, ...]
		    [ FROM lista ]
		    [ WHERE condicion
		&gt; ]
	</pre>   
	<br>

	<b>*DELETE</b> :Borra filas de una tabla. <br>
	<pre>		DELETE FROM table [ WHERE condition ]
	</pre> 
	Inputs <br>
	table <br>
	El nombre de una tabla existente. <br>

	condition <br>
	Esta es una consulta SQL de seleccion la cual devuelve las filas a ser 
borradas. <br>
	Referirse al comando SELECT para una mayor descripcion de la clausula 
WHERE. <br>
</blockquote>

      <h4>4. select        </h4>

<blockquote>
	<b>SELECT</b> : Recupera registros desde una tabla o vista. <br>	
	<pre>		SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
		    expression [ AS name ] [, ...]
		    [ INTO [ TEMPORARY | TEMP ] [ TABLE ] new_table ]
		    [ FROM table [ alias ] [, ...] ]
		    [ WHERE condition ]
		    [ GROUP BY column [, ...] ]
		    [ HAVING condition [, ...] ]
		    [ { UNION [ ALL ] | INTERSECT | EXCEPT } select ]
		    [ ORDER BY column [ ASC | DESC | USING operator ] [, ...] ]
		    [ FOR UPDATE [ OF class_name [, ...] ] ]
		    LIMIT { count | ALL } [ { OFFSET | , } start ]
	</pre>   
	Inputs <br>
	expression <br>
	El nombre de una columna de la tabla o una expresion <br>

	name <br>
	Especifica otro nombre para una columna o una expresion que utilice la 
clausula AS. Este nombre se utiliza principalmente como etiqueta para la
 
	columna de salida. <br>
	El nombre no puede ser utilizado en las clausulas WHERE, GROUP BY o 
HAVING. Sin embargo, puede ser referenciado en clausulas ORDER BY. <br>
	<br>
	TEMPORARY, TEMP : La tabla se crea solamente para esta sesion y es 
automaticamente descartada al finalizar la misma. <br>
	new_table<br>

	Si se utiliza la clausula INTO TABLE, el resultado de la consulta se 
almacenara en otra tabla con el nombre indicado. La tabla objetivo 
(new_table) sera creada
	automaticamente y no debera existir previamente a la utilizacion de 
este comando. <br>
	<br>
	La declaracion CLASS="COMMAND" &gt;CREATE TABLE AS tambien creara una 
nueva tabla a partir de la consulta. <br>
	table : El nombre de una tabla existente a la que se refiere la 
clausula FROM. <br>
	alias : Un nombre alternativo para la tabla precedente table. Se 
utiliza para abreviar o eliminar ambiguas en uniones dentro de una misma
 tabla. <br>
	condition : Una expresion booleana que da como resultado verdadero o 
falso (true or false). <br>

	column : El nombre de una columna de la tabla. <br>
	select : Una declaracion de seleccion select) exceptuando la clausula 
ORDER BY. <br>
</blockquote>

      <h4>5. drop table / drop database</h4>

<blockquote>
	<b>DROP TABLE</b> [Eliminar Tabla] : Elimina tablas de una base de 
datos. 
	<pre>		DROP TABLE nombre [, ...]
	</pre>  
	<br> 
	Entradas <br> 
	nombre <br> 
	El nombre de una tabla vista existente para eliminarla. <br> 

	<b>DROP DATABASE</b> : Elimina una base de datos existente.
	<pre>		DROP DATABASE name
	</pre>   
	Entradas <br>

	name <br>
	El nombre de una base de datos existente que se desaea eliminar. <br>
</blockquote>

    </blockquote>
    <h2> <font color="#006600">4. El lenguaje de programación.        </font></h2>
    <h4>4.1. Consideraciones del lenguaje y el modelo de runtime.       </h4>
 
	<p><font color="#FF0000"> <u> Links utilizados para resolver estos ejercicios:</u></font></p>
	<ul>
		<li> <a href="http://www.python.org/doc"> Documentacion Python oficial </a>	</li>
		<li> <a href="http://mundogeek.net/tutorial-python/"> Python Tutorial </a>	</li>
		<li> <a href="http://python.org.ar/pyar/"> PyAr </a> 	</li>
		<li> <a href="http://xkcd.com/353/"> The python!</a>	</li>
	</ul>
	
    <blockquote>
      <h4>1. cómo es el modelo de objetos (clases, objetos, herencia, metaprogramación)        </h4>
      <p>Python está completamente orientado a objetos: puede definir sus propias   clases, heredar de las que nosotros definamos o de las incorporadas en   el lenguaje, e   	instanciar las clases que haya definido.<br>
Definir una clase en Python es simple. Como con las funciones, no hay   una definición interfaz separada. Simplemente defina la clase y empiece a   escribir código.  	Una clase de Python empieza con la palabra reservada class, seguida de   su nombre. Técnicamente, esto es todo lo que necesita, ya que la clase   no tiene por qué  	heredar de ninguna otra. </p>
      <h4>2. cómo enviar logs desde los scripts</h4>
      <h4> 3. cómo se manejan las excepciones</h4>
      <p>Una exepción es un evento que ocurre durante la ejecución de un
 programa y require la   ejecución de codigo fuera del flujo normal de 
control. </p>
      <p>La acción asociada a una excepción es  producir un mensaje   
informativo y terminar; otras veces, es sólo indicación de la necesidad 
  de un cambio en la estrategia de resolución del problema. </p>
      <p> Al producirse una excepción se desciende en la pila de 
ejecución hasta encontrar un manejador para la excepción, el cual toma 
el control en ese momento. Por ejemplo:</p>
      <pre>try:      
	result = x / y 
except ZeroDivisionError:      
	print "division by zero!"  
else:      
	print "result is", result 
finally:      print "executing finally clause"</pre>
      <h4>4. manejo de fechas        </h4>
      <blockquote>
        <p>El módulo datatime entrega clases para la manipulación de fecha y   hora en ambos de manera simple y también compleja. Si bien en la fecha y   hora se   	admite la aritmética, el foco de la aplicación es la extracción   eficiente para el formato de salida y la manipulación de sus fragmentos.</p>
        <p>Hay dos tipos de objetos fecha y hora:   "ingenua" y "consciente".   Esta distinción se refiere a   si el objeto tiene alguna noción de zona   horaria, el   	horario de verano, u otro tipo de ajuste de la hora de algoritmos o   políticas.</p>
        <p>El módulo datatime exporta las siguientes constantes:</p>
        <ul>
          <li>datatime.MINYEAR</li>
          <li>datatime.MAXYEAR</li>
        </ul>
        <p>Tipos   disponibles:<br>
          class datetime.date: Atributos: year,   month, y day.<br>
          class datetime.time: Atributos: hour, minute, second,   microsecond, y   tzinfo.<br>
          class datetime.datetime: Atributos: year,   month, day, hour, minute,   second, microsecond y tzinfo.<br>
          datetime.timedelta: expresa la diferencia entre dos instancias     diferentes de atributos date, time o datetime.<br>
          datetime.tzinfo:   Atributos: date, time y datetime. Utilizado para   manejar zonas horarias.</p>
      </blockquote>
      <h4>5. manejo de strings</h4>
      <p>El módulo string contiene una serie de constates y clases, asi como   algunas funciones que están disponibles como metodos de los strings.<br>
El formato de salida de string utiliza plantillas de strings o el   operador %. <br>
<br>
Para ver los diversos métodos para utilizar ingrese <a href="http://docs.python.org/library/string.html#module-string">aquí</a></p>
      <h4> 6. manejo de colecciones (hash, array, lists, trees, etc.)     </h4>
      <blockquote>
        <ul>
          <li><a href="http://docs.python.org/library/hashlib.html#module-hashlib"> Hash </a></li>
          <li><a href="http://docs.python.org/library/array.html#index-217"> Array </a></li>
          <li><a href="http://docs.python.org/glossary.html#term-li"> Lists</a></li>
		 </ul>
	</blockquote>
	
     <h4>7. drivers de bases de datos (en especial pg)        </h4>
	     <p>El controlador que se recomieda usar para PostgresSQL en Python es psycopg2.</p>
     <h4>8. cómo se maneja la concurrencia (procesos, threads, microthreads, etc.) </h4>
		<p>	En Python se puede crear nuevos procesos mediante la función os.fork, que ejecuta la llamada al sistema fork, o mediante otras funciones más avanzadas como popen2.popen2, de forma que el programa pueda realizar varias tareas de forma paralela. Sin embargo el cambio de contexto puede ser relativamente lento, y los recursos necesarios para mantener el estado demasiados, por lo que a menudo es mucho más eficaz utilizar lo que se conoce como threads, hilos de ejecución, o procesos ligeros.
Los hilos están implementados y se pueden manejar a través de los módulos thread y threading, ambos referenciados en el API oficial. En realidad, thread no es más que una versión a más bajo nivel que threading, por lo que en la programación habitual se suele usar esta última, por ser más cómoda para el programador. La implementación de hilos, procesos y sincronización en Python, siguiendo la filosofía del lenguaje, es en principio una tarea sencilla. Sin embargo, el añadir hilos a un programa en Python para hacerlo más eficiente no siempre es el paso correcto.</p>
</blockquote>
    <h4>4.2. Ejercicios.        </h4>
	<font size="-1">
    <h5>Strings</h5>
	<blockquote>
      <h5> 1. Dado el string " HELLO WORLD"  convertirlo a minúsculas   </h5>
      <p>'HELLO WORLD'.lower() </p>
      <h5>2. Dado una cadena de caracteres, obtener otra con los 
caracteres invertidos (el primero en último lugar, etc.)</h5>
      <p>'CADENAQUEQUIEROQUESEINVIERTA'[::-1]</p>
      <h5> 3. Pasar a mayúsculas las primeras letras de cada palabra de 
un array o lista de palabras.</h5>
      <p>for palabra in lista_palabras: lista_palabras[lista_palabras.index(palabra)] = palabra[0].upper() + palabra[1:len(palabra)] </p>
      <h5> 4. Reemplazar todas las vocales que aparecen en el texto por 
una " X" .        </h5>
      <pre>
	 for letra in texto:
		if letra.lower() in   ['a','e','i','o','u']:
			texto=texto[:texto.index(letra)]+'X'+texto[texto.index(letra)+1:len(texto)]</pre>
</blockquote>
    <h4>Fechas        </h4>
    <blockquote>
      <h5>1. Obtener la lista de nombres de todos los meses del año:    </h5>
<pre>
import calendar
for mes in calendar.month_name: 
	print mes
</pre>
      <h5>2. Obtener la lista de nombres de todos los dias de la semana:</h5>
<pre>
import calendar
for dia in calendar.day_name:
	print dia
</pre>
      <h5> 3. A) Teniendo en cuenta que el " día comercial"  número 1 es el
 lunes (martes es el 2, miercoles es 3 etc.) y el número de semana 
comercial del año se cuenta en forma incremental desde la semana 1 (1er 
semana de Enero), obtener el día, semana y año comercial del día de hoy 
por ej: 
        
        " dia: 4 semana: 13 del: 2009"         </h5>
<pre>
import datetime
datetime.datetime.today.strf("Dia:%w Semana:%W año:%Y")
</pre>		
		
      <h5>B) Supongamos que estamos desarrollando un sistema comercial, en 
muchas partes del mismo usamos un método o función para obtener el 
string que le corresponde a la fecha dada, para mostar las Fechas, pero 
ahora el cliente nos pide que todas las fechas que se muestran el 
sistema se vean con el formato " comercial"  descripto en el ejercicio 
anterior.<br>Tenemos muy poco tiempo (es una ocasión excepcional :) ) para 
resolver este nuevo pedido del cliente y hay aproximadamente 500 
sentencias repartidas en alrededor de 40 archivos que utilizan el 
mencionado método o función, (el programador anterior era muy malo y no 
se ocurrió otra forma de hacerlo) <br> ¿Cual sería una solución factible posible?        </h5>
La solucion mas simple seria dentro de nuestro codigo, reescribir el metodo str de la funcion utilizada
      <h5>4. Qué día de la semana naciste ?        </h5>
<pre>
print datetime.date(1986,10,16).strfdate("%A")
</pre>
      <h5>5. Cuantos días de vida tenés?        </h5>
<pre>
print datetime.date.today() - datetime.date(1986,10,16)
</pre>
</blockquote>
    <h4>Listas, Arrays</h4>
    </font><blockquote>
      <h5><font size="-1"> 1. Dado un array con nombres de persona eliminar los nombre que comienzan con “Pe” </font></h5>
	  <pre><font size="-1">
for nombre in lista_nombres:
	if "Pe" == nombre[:2]:
		lista_nombre.remove(nombre)	  		
	  </font></pre>
      <h5><font size="-1">2. Verificar si el array del ejercicio anterior contiene el nombre “Raul”</font></h5>
	  <font size="-1">print("Raul" in lista_nombres)
      <h5> 3. Generar un string con todos los nombres que contiene el array unidos por “-” </h5>
	  '-'.join([nombre for nombre in lista_nombres]) 
      <h5>4.a) Generar un segundo array con los nombres todos en minúsculas ordenado alfabéticamente <br> 
	  4.b) Desordenar el array de nombres</h5>
<pre>	  
a)lista_nombres2 = lista_nombres.sort()
b)import random
  random.shuffle(lista_nombres)

</pre>
      <h5>5. Averiguar si la lista siguiente tiene números pares: lista= [1, 2, 3, 4, 5]        </h5>
		for item in lista:  print ((item % 2) == 0)
	  
	  
      <h5>6. Generar un array que contenga los números enteros desde el 1 al 99999:</h5>
	  lista = range(100000)
	  lista.remove(0)

      <h5> 7. Cual es el resultado de multiplicar todos los números que contiene el array anterior?</h5>
      <p>Para ver como fue realizado click <a href="src/factor.py">Aqui</a> <br>
      Para ver la respuesta haga click <a href="src/respuesta.txt">Aquí</a> </p></font>

</blockquote>
	
</body></html>